# OTA管理系统后端 Dockerfile
# 多阶段构建，优化镜像大小

# 构建阶段
FROM golang:1.21-alpine AS builder

# 设置工作目录
WORKDIR /app

# 安装必要的系统依赖
RUN apk add --no-cache git ca-certificates tzdata gcc musl-dev sqlite-dev

# 设置Go模块代理（加速依赖下载）
ENV GOPROXY=https://goproxy.cn,direct
ENV GO111MODULE=on
ENV CGO_ENABLED=1

# 复制go.mod和go.sum文件
COPY go.mod go.sum ./

# 下载依赖
RUN go mod download

# 复制源代码
COPY . .

# 构建应用程序
RUN go build -a -installsuffix cgo -ldflags '-extldflags "-static"' -o ota-server .

# 运行阶段
FROM alpine:3.18 AS runtime

# 安装运行时依赖
RUN apk add --no-cache \
    ca-certificates \
    tzdata \
    sqlite \
    && rm -rf /var/cache/apk/*

# 设置时区
ENV TZ=Asia/Shanghai

# 创建非root用户
RUN addgroup -g 1001 -S ota && \
    adduser -u 1001 -S ota -G ota

# 设置工作目录
WORKDIR /app

# 创建必要的目录
RUN mkdir -p data packages/files logs config script && \
    chown -R ota:ota /app

# 复制构建好的二进制文件
COPY --from=builder /app/ota-server .

# 复制配置文件
COPY --chown=ota:ota config/config.yaml config/

# 复制数据库初始化脚本
COPY --chown=ota:ota script/ script/

# 复制静态文件（如果有的话）
# COPY --chown=ota:ota static/ static/

# 确保二进制文件有执行权限
RUN chmod +x ota-server && \
    chmod +x script/setup_database.sh

# 切换到非root用户
USER ota

# 暴露端口
EXPOSE 8081

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD wget --no-verbose --tries=1 --spider http://localhost:8081/test/api/health || exit 1

# 启动命令
CMD ["./ota-server"] 